module sw.menuitem;
import sw.locale.locale, nazo.http, sw.siteconfig, std.stdio, nazo.string, std.uri, nazo.xhtml, sw.mode, sw.modelist, sw.utils, sw.main, std.c.stdlib, nazo.string;

struct CreateMenuItem{
  private{
    SiteConfig* cfg;
  }
  public{
    ///
    enum Method{
      GET, ///
      POST, ///
    }
    ///メニューの作成(mode=ローカライズIDの場合)
    void create(string mode, Method method = Method.GET)(Menu* menu,string[] args...){
      createWithId!(getMenuLocaleId(mode), method)(menu,mode,args);
    }
    ///メニューの作成(ローカライズIDをラベルに利用)
    void createWithId(Locale.Menu id, Method method = Method.GET)(Menu* menu,string mode,string[] args...){
      createWithLabel!(method)(menu,mode,CGI.locale.getValue!(id)(),args);
    }
    ///メニューの作成(自由な文字列をラベルに利用)
    ///Bugs: 理解不能な行があるので一回、PathInfoを変更して試す必要性あり。
    void createWithLabel(Method method)(Menu* menu,string mode,string label,string[] args...){
      static if(top==Type.Wiki){if(startWith(mode,"wiki:"))mode=mode["wiki:".length..$];}
      static if(top==Type.Uploader){if(startWith(mode,"upload:"))mode=mode["upload:".length..$];}
      static if(top==Type.BugTracking){if(startWith(mode,"bug:"))mode=mode["bug:".length..$];}
      assert(args.length%2==0);
      static if(method==method.GET){
/*        string cmd=mode;
        for(int i;i<args.length;i++){
          if(args[i]=="title"&&cfg.usePathInfo){
            path~="/"~argToParam(args[++i]);
            continue;
          }
          cmd~="&amp;"~args[i]~"="~encodeComponent(args[i+1]);
          i++;
        }
        menu.content="<a href=\""~path~"?mode="~cmd~"\">"~label~"</a>";
*/
        scope string* cmd = cast(string*)alloca((8 + (args.length<<1))*(string).sizeof);
        cmd[0]="<a href=\"";
        cmd[1]=Http.relPath;

        cmd[4]="?mode=";
        cmd[5]=mode;
        int j=6;
        if(!cfg.usePathInfo)
          j=2;
        bool f;
        for(int i;i<args.length;i++){
          if(args[i]=="title"&&cfg.usePathInfo){
            cmd[2]="/";
            cmd[3]=argToParam(args[++i]);
            f=true;
            continue;
          }
          cmd[j++]="&amp;";
          cmd[j++]=args[i++];
          cmd[j++]="=";
          cmd[j++]=encodeComponent(args[i]);
        }
        cmd[j++]="\">";
        cmd[j++]=label;
        cmd[j++]="</a>";
        if(!f)
          cmd[2] = cmd[3] = null;
        menu.content=nazo.string.join(cmd[0..j]);
      }else{
      string path=Http.relPath;
        string cmd;
        for(int i;i<args.length;i++){
          if(args[i]=="title"&&cfg.usePathInfo){
            path~="/"~argToParam(args[++i]);
            continue;
          }
          cmd~="<input type=\"hidden\" name=\""~args[i]~"\" value=\""~Escape.arg(args[i+1])~"\"/>\n";
          i++;
        }
        menu.content="<form action=\""~path~"\" method=\"post\" style=\"display:inline\">\n<input type=\"hidden\" name=\"mode\" value=\""~mode~"\"/>\n"~cmd~"<input type=\"submit\" value=\""~label~"\"/>\n</form>";
      }
    }
    ///メニュー作成をする時に使うコンストラクタです。
    static typeof(this) opCall(SiteConfig* cfg){
      typeof(this) rv;
      rv.cfg=cfg;
      return rv;
    }
  }
}
